#include<string>
#include<iostream>
#include<unordered_map>
using namespace std;


//string minWindow(string s, string t) {
//    string ret;
//    unordered_map<char, int> hash1, hash2;
//    for (auto& ch : t) hash1[ch]++;
//    int type = hash1.size(), n = s.size(), count = 0;
//    for (int left = 0, right = 0; right < n; right++)
//    {
//        hash2[s[right]]++;
//        if (hash2[s[right]] == hash1[s[right]]) count++;
//        if (count == type)
//        {
//            if (ret.size() == 0 || ret.size() > right - left + 1)
//            {
//                ret.clear();
//                string rret = s.substr(left, right + 1);
//                ret = rret;
//            }
//
//            char out = s[left];
//            while (!hash1[out] || hash1[out] != 0)
//            {
//                if (hash2[out] == hash1[out])count--;
//                hash2[out]--;
//                left++;
//            }
//        }
//
//    }
//    return ret;
//}
//
//
//string minWindow(string s, string t) {
//    string ret;
//    unordered_map<char, int> hash1, hash2;
//    for (auto& ch : t) hash1[ch]++;
//    int type = hash1.size(), n = s.size(), count = 0;
//    for (int left = 0, right = 0; right < n; right++)
//    {
//        char in = s[right];
//        hash2[in]++;
//        if (hash2[in] == hash1[in]) count++;
//        if (count == type)
//        {
//            if (ret.size() == 0 || ret.size() > right - left + 1)
//            {
//                ret.clear();
//                string rret = s.substr(left, right + 1);
//                ret = rret;
//            }
//        }
//        char out = s[left];
//        while (count == type)
//        {
//            if (hash2[out] == hash1[out])count--;
//            hash2[out]--;
//            left++;
//        }
//
//    }
//    return ret;
//}

string minWindow(string s, string t) {
    string ret;
    unordered_map<char, int> hash1, hash2;
    for (auto& ch : t) hash1[ch]++;
    int type = hash1.size(), n = s.size(), count = 0;
    for (int left = 0, right = 0; right < n; right++)
    {
        char in = s[right];
        if (++hash2[in] == hash1[in]) count++;
        while (count == type)
        {
            if (ret.size() == 0 || ret.size() > right - left + 1)
            {
                ret.clear();
                string rret = s.substr(left, right + 1);
                ret = rret;
            }

            char out = s[left++];
            if (hash2[out]-- == hash1[out]) count--;
        }

    }
    return ret;
}
int main()
{
    string s = "ABC";
    string s1 = "B";

    minWindow(s, s1);
    return 0;
}
